package Math;//给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
//
// 如果存在一个整数 x 使得 n == 2ˣ ，则认为 n 是 2 的幂次方。 
//
// 
//
// 示例 1： 
//
// 
//输入：n = 1
//输出：true
//解释：2⁰ = 1
// 
//
// 示例 2： 
//
// 
//输入：n = 16
//输出：true
//解释：2⁴ = 16
// 
//
// 示例 3： 
//
// 
//输入：n = 3
//输出：false
// 
//
// 示例 4： 
//
// 
//输入：n = 4
//输出：true
// 
//
// 示例 5： 
//
// 
//输入：n = 5
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// -2³¹ <= n <= 2³¹ - 1 
// 
//
// 
//
// 进阶：你能够不使用循环/递归解决此问题吗？ 
// Related Topics 位运算 递归 数学 👍 417 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class isPowerOfTwo {

    public static boolean isPowerOfTwo(int n) {
        //特例处理
        if(n < 0 ){
            return false;
        }
        if(n==1){
            return true;
        }
        //如果是奇数
        if( (n & 1) == 1){
            return false;
        }
        //位运算，2的幂的话，位数中只有一个1，且不在末位
        int count = 0; //统计位数1的个数
        for(; n!=0 ; n >>= 1){
            if((n&1)==1){
                count++;
            }
        }
        return count==1 ? true : false;
    }


    public static boolean isPowerOfTwo1(int n) {

        //n & n-1可以把n最低位的1变0，而当n & n-1 == 0时，则说明n只有一个1。
        // 4 的二进制 100，3的二进制 011，  100 & 011 == 0
        //当只有一个1且不再末尾，必为2的幂
        return n > 0 && (n & (n - 1)) == 0;
    }

    public static void main(String[] args) {
        System.out.println(isPowerOfTwo(64));
    }
}
//leetcode submit region end(Prohibit modification and deletion)
